// package com.xuyuan.cpn.es;
//
// import org.elasticsearch.index.query.BoolQueryBuilder;
// import org.elasticsearch.index.query.QueryBuilders;
// import org.elasticsearch.search.sort.SortBuilders;
// import org.elasticsearch.search.sort.SortOrder;
// import org.junit.Before;
// import org.junit.jupiter.api.Test;
// import org.junit.runner.RunWith;
// import org.slf4j.Logger;
// import org.slf4j.LoggerFactory;
// import org.springframework.boot.test.context.SpringBootTest;
// import org.springframework.data.domain.PageRequest;
// import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
// import org.springframework.data.elasticsearch.core.IndexOperations;
// import org.springframework.data.elasticsearch.core.SearchHits;
// import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
// import org.springframework.test.context.junit4.SpringRunner;
//
// import javax.annotation.Resource;
// import java.math.BigDecimal;
// import java.util.Optional;
//
// @RunWith(SpringRunner.class)
// @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
// public class OrderESTest {
//     private static final Logger logger = LoggerFactory.getLogger(OrderESTest.class);
//
//     @Resource
//     private ElasticsearchRestTemplate template;
//
//     @Resource
//     private OrderRepository orderRepository;
//
//     @Before
//     public void setUp() {
//         if (template == null || orderRepository == null) {
//             throw new IllegalStateException("ElasticsearchRestTemplate or OrderRepository is not initialized");
//         }
//     }
//
//     /**
//      * 创建索引和映射
//      */
//     @Test
//     public void test() {
//         try {
//             IndexOperations indexOperations = template.indexOps(OrderDoc.class);
//             // 创建索引
//             indexOperations.create();
//             // 创建映射
//             indexOperations.putMapping(OrderDoc.class);
//
//         } catch (Exception e) {
//             logger.error("Error occurred during index and mapping creation: ", e);
//             throw e;
//         }
//     }
//
//     /**
//      * 添加数据到ES
//      */
//     @Test
//     public void testAdd() {
//         orderRepository.save(new OrderDoc(1L, "买了一个表", 1, 1, new BigDecimal("200")));
//     }
//
//     /**
//      * 查询数据
//      */
//     @Test
//     public void testGet() {
//         Optional<OrderDoc> optional = orderRepository.findById(1l);
//         System.out.println(optional.get());
//     }
//
//     /**
//      * 删除数据
//      */
//     @Test
//     public void testDelete() {
//         orderRepository.deleteById(1L);
//     }
//
//     /**
//      * 搜索 - 全文检索
//      */
//     @Test
//     public void testSearch1() {
//     }
//
//     /**
//      * 搜索 - 术语检索
//      */
//     @Test
//     public void testSearch2() {
//
//     }
//
//     /**
//      * 搜索 - 聚合检索
//      */
//     @Test
//     public void testSearch3() {
//         try {
//             // 查询构建器
//             NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
//             builder.withPageable(PageRequest.of(1, 10));
//             builder.withSort(SortBuilders.fieldSort("amount").order(SortOrder.DESC));
//
//             // 构建组合查询
//             BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//             // 标题包含鼠标
//             // match 模糊匹配、term 精确匹配
//             boolQuery.must(QueryBuilders.matchQuery("title", "鼠标"))
//                     // 状态值查询
//                     .filter(QueryBuilders.termQuery("status", 1))
//                     // 金额范围查询
//                     .filter(QueryBuilders.rangeQuery("amount").gte(10).lte(2000));
//
//             // 添加查询条件
//             builder.withQuery(boolQuery);
//             // 执行搜索
//             SearchHits<OrderDoc> searchHits = template.search(builder.build(), OrderDoc.class);
//
//             // 获取条数
//             long totalHits = searchHits.getTotalHits();
//             logger.info("Total elements found: {}", totalHits);
//
//             if (totalHits > 0) {
//                 searchHits.get().forEach(orderDoc -> logger.info("Order: {}", orderDoc.getContent()));
//             } else {
//                 logger.info("No orders found matching the criteria.");
//             }
//         } catch (Exception e) {
//             logger.error("Error occurred during search: ", e);
//             throw new RuntimeException("Search failed", e);
//         }
//     }
//
//     /**
//      * 搜索 - 聚合检索
//      */
//     @Test
//     public void testSearch4() {
//
//     }
//
//     /**
//      * 搜索 - 结果高亮
//      */
//     @Test
//     public void testSearch5() {
//
//     }
//
//     /**
//      * 搜索 - 排序
//      */
//     @Test
//     public void testSearch6() {
//
//     }
//
//     /**
//      * 搜索 - 分页
//      */
//     @Test
//     public void testSearch7() {
//
//     }
//
//     /**
//      * 搜索 - 过滤
//      */
//     @Test
//     public void testSearch8() {
//
//     }
// }
